[XEN] Shadow: fix mark_dirty invocation to use gfn, not mfn
authorTim Deegan <Tim.Deegan@xensource.com>
Thu, 8 Mar 2007 16:20:01 +0000 (16:20 +0000)
committerTim Deegan <Tim.Deegan@xensource.com>
Thu, 8 Mar 2007 16:20:01 +0000 (16:20 +0000)
Signed-off-by: Tim Deegan <Tim.Deegan@xensource.com>
xen/arch/x86/hvm/hvm.c

index f48bb6f49a80dcb7a896806edbb9bf5c962084de..d03824bc0e24b81a33d798b4f12d577c298e11c6 100644 (file)
@@ -380,7 +380,7 @@ void hvm_triple_fault(void)
  */
 static int __hvm_copy(void *buf, paddr_t addr, int size, int dir, int virt)
 {
-    unsigned long mfn;
+    unsigned long gfn, mfn;
     char *p;
     int count, todo;
 
@@ -390,9 +390,11 @@ static int __hvm_copy(void *buf, paddr_t addr, int size, int dir, int virt)
         count = min_t(int, PAGE_SIZE - (addr & ~PAGE_MASK), todo);
 
         if ( virt )
-            mfn = get_mfn_from_gpfn(paging_gva_to_gfn(current, addr));
+            gfn = paging_gva_to_gfn(current, addr);
         else
-            mfn = get_mfn_from_gpfn(addr >> PAGE_SHIFT);
+            gfn = addr >> PAGE_SHIFT;
+        
+        mfn = get_mfn_from_gpfn(gfn);
 
         if ( mfn == INVALID_MFN )
             return todo;
@@ -400,14 +402,15 @@ static int __hvm_copy(void *buf, paddr_t addr, int size, int dir, int virt)
         p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
 
         if ( dir )
+        {
             memcpy(p, buf, count); /* dir == TRUE:  *to* guest */
+            mark_dirty(current->domain, gfn);
+        }
         else
             memcpy(buf, p, count); /* dir == FALSE: *from guest */
 
         unmap_domain_page(p);
         
-        mark_dirty(current->domain, mfn);
-
         addr += count;
         buf  += count;
         todo -= count;